// 信号量接口的使用

#include <iostream>
#include <pthread.h>
#include <string>
#include <semaphore.h>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
sem_t sem; // 信号量 , 主新线程共享

void *work(void *args)
{
    // 为主线程创建信号量 ,
    std::string name = static_cast<const char *>(args);
    int cnt = 5;
    while (cnt--)
    {
        // 消耗资源 -- P操作 , --信号量
        sem_wait(&sem);

        pthread_mutex_lock(&mutex);
        std::cout << "我是新线程 : " << name << " 我消耗了一个资源 !" << std::endl;
        pthread_mutex_unlock(&mutex);

        sleep(2); // 我每隔2s拿一个
    }
    return nullptr;
}

int main()
{
    // 考虑一个问题 , 是先创建线程呢 ?? 还是先创建信号量呢 ??
    // 先创建信号量 , 因为信号量是表示资源的多少 , 表示有几个线程访问资源
    // 所以先创建信号量 , 表示有线程就就绪了 , 如果信号量都创建失败了 , 线程就没有必要创建了

    // 初始化信号量 , 刚开始没有资源 , 所以为 : 0
    sem_init(&sem, 0, 0);

    // 创建一个线程
    pthread_t tid;
    pthread_create(&tid, nullptr, work, (void *)"thread-1");

    // 主线程
    // 主线程放资源 , P操作
    int cnt = 5;
    while (cnt--)
    {
        sleep(1); // 每隔 1s 放一个资源
        // V操作 , ++ 信号量 , 所以放资源
        sem_post(&sem);
        pthread_mutex_lock(&mutex);
        std::cout << " 我是主线程 , 我放了一个资源 , 等待新线程消耗 .. " << std::endl;
        pthread_mutex_unlock(&mutex);
    }

    // 等待线程
    pthread_join(tid, nullptr);

    sem_destroy(&sem);

    return 0;
}